package com.micro.school.order.service.impl;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import com.micro.school.common.core.constant.PayConstants;
import com.micro.school.common.core.domain.R;
import com.micro.school.common.core.web.domain.AjaxResult;
import com.micro.school.common.security.utils.SecurityUtils;
import com.micro.school.order.bo.PayStandardFeeItemBo;
import com.micro.school.order.entity.PayFeeItemConfig;
import com.micro.school.order.entity.PayStandardFeeItem;
import com.micro.school.order.entity.PayStandardFeeItemDetail;
import com.micro.school.order.mapper.PayStandardFeeItemMapper;
import com.micro.school.order.service.IPayFeeItemConfigService;
import com.micro.school.order.service.IPayStandardFeeItemDetailService;
import com.micro.school.order.service.IPayStandardFeeItemService;
import com.micro.school.order.vo.PayStandardFeeItemVo;
import com.micro.school.system.api.RemoteEduService;

import com.micro.school.system.api.domain.vo.*;
import com.micro.school.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 标准收费项目管理Service业务层处理
 * 
 * @author lyb
 * @date 2025-08-14
 */
@Service
public class PayStandardFeeItemServiceImpl implements IPayStandardFeeItemService
{
    @Autowired
    private PayStandardFeeItemMapper payStandardFeeItemMapper;

    @Autowired
    private IPayStandardFeeItemDetailService detailService;

    @Autowired
    private IPayFeeItemConfigService configService;

    @Autowired
    private RemoteEduService eduService;


    /**
     * 查询标准收费项目管理
     * 
     * @param id 标准收费项目管理主键
     * @return 标准收费项目管理
     */
    @Override
    public PayStandardFeeItemVo selectPayStandardFeeItemById(Long id)
    {
        return payStandardFeeItemMapper.selectPayStandardFeeItemById(id);
    }

    /**
     * 查询标准收费项目管理列表
     * 
     * @param payStandardFeeItem 标准收费项目管理
     * @return 标准收费项目管理
     */
    @Override
    public List<PayStandardFeeItemVo> selectPayStandardFeeItemList(PayStandardFeeItem payStandardFeeItem)
    {
        return payStandardFeeItemMapper.selectPayStandardFeeItemList(payStandardFeeItem);
    }

    /**
     * 新增标准收费项目管理
     * 
     * @param payStandardFeeItem 标准收费项目管理
     * @return 结果
     */
    @Override
    public int insertPayStandardFeeItem(PayStandardFeeItem payStandardFeeItem)
    {
        return payStandardFeeItemMapper.insertPayStandardFeeItem(payStandardFeeItem);
    }


    /**
     * 新增标准收费项目管理
     *
     * @param itemBo 标准收费项目管理
     * @return 结果
     */
    @Override
    @Transactional
    public AjaxResult insertPayStandardFeeItem(PayStandardFeeItemBo itemBo){
        //转实体
        PayStandardFeeItem item = JSON.parseObject(JSON.toJSONString(itemBo), PayStandardFeeItem.class);
       //转明细
        List<PayStandardFeeItemDetail> detailList = JSON.parseObject(
                JSON.toJSONString(itemBo.getDetails()),
                new TypeReference<List<PayStandardFeeItemDetail>>() {}
        );
        if(null==detailList || detailList.isEmpty()){
            return AjaxResult.error("明细不能为空！");
        }
        //求和
        BigDecimal total = BigDecimal.ZERO;
        for(PayStandardFeeItemDetail detail:detailList){
            total = total.add(detail.getItemPrice());
        }
        item.setTotalAmount(total);

        LoginUser loginUser = SecurityUtils.getLoginUser();
        item.setCreateTime(new Date());
        item.setUpdateBy(loginUser.getUserid().toString());
        item.setCreateBy(loginUser.getUserid().toString());
        item.setUpdateTime(item.getCreateTime());
        item.setCreateDept(item.getCreateDept());
        item.setTenantId(loginUser.getSysUser().getTenantId().intValue());
        PayStandardFeeItemVo feeItemDb = queryInner(itemBo);
        //设置字段名（学院专业名、学院模式、校区信息 等等）
        setNames(item);
        if(null!=feeItemDb){
            //如果已经部分支付返回
            if(!feeItemDb.getGenerateStatus().equals(PayConstants.YESORNO_N)){
                return AjaxResult.error("已生成账单，不允许修改");
            }
            //更新
            item.setId(feeItemDb.getId());
            updatePayStandardFeeItem(item);
        }else {
            //保存主实体
            insertPayStandardFeeItem(item);
        }
        //删除明细
        detailService.deletePayStandardFeeItemDetailByFeeItemId(item.getId());

        //查询配置名
        Map<Long, PayFeeItemConfig> confgDic = configService.queryToMap(SecurityUtils.getIntTenantId());
        //填补配置名称
        for(PayStandardFeeItemDetail detail:detailList){
            detail.setFeeItemId(item.getId());
            if(null!=confgDic && confgDic.containsKey(detail.getFeeItemConfigId())){
                PayFeeItemConfig config = confgDic.get(detail.getFeeItemConfigId());
                detail.setFeeItemConfigName(config.getItemName());
                detail.setOrderNum(config.getOrderNum().intValue());
            }
        }
        //保存明细
        detailService.insertBatch(detailList);
        return AjaxResult.success();
    }

    private void setNames(PayStandardFeeItem item){
        //设置year名
        if(null!=item.getFeeYearId()){
            R<SchoolFeeYearVos> feeYearR = eduService.getYearById(item.getFeeYearId().longValue());
            if(null!=feeYearR && null!=feeYearR.getData()){
                SchoolFeeYearVos feeYear = feeYearR.getData();
                if(null!=feeYear){
                    item.setFeeYear(feeYear.getFeeYear());
                }
            }
        }

        //学院专业
        if(null!=item.getCollegeId()){
            R<SchoolCollegeVos> beanR = eduService.getCollegeById(item.getCollegeId());
            if(null!=beanR && null!=beanR.getData()){
                SchoolCollegeVos bean = beanR.getData();
                if(null!=bean){
                    item.setCollegeName(bean.getCollegeName());
                }
            }
        }

        //学院模式
        if(null!=item.getModelId()){
            R<CollegeModelVos> beanR = eduService.getModelById(item.getModelId());
            if(null!=beanR && null!=beanR.getData()){
                CollegeModelVos bean = beanR.getData();
                if(null!=bean){
                    item.setModelName(bean.getModelName());
                }
            }
        }

        //校区信息
        if(null!=item.getCampusId()){
            R<SchoolCampusVos> beanR = eduService.getCampusById(item.getCampusId());
            if(null!=beanR && null!=beanR.getData()){
                SchoolCampusVos bean = beanR.getData();
                if(null!=bean){
                    item.setCampusName(bean.getCampusName());
                }
            }
        }

        //专业
        if(null!=item.getMajorId()){
            R<CollegeMajorVos> majorR= eduService.getMajorById(item.getMajorId());
            if(null!=majorR && null!=majorR.getData()){
                CollegeMajorVos bean = majorR.getData();
                if(null!=bean){
                    item.setMajorName(bean.getMajorName());
                }
            }
        }

        //学院信息
//        if(null!=item.getCollegeId()){
//            R<SchoolCollegeVos> beanR = eduService.getCollegeById(item.getCollegeId());
//            if(null!=beanR && null!=beanR.getData()){
//                SchoolCollegeVos bean = beanR.getData();
//                if(null!=bean){
//                    item.setCollegeName(bean.getCollegeName());
//                }
//            }
//        }

        //学校收费学年
//        if(null!=item.getFeeYearId()){
//            R<SchoolFeeYearVos> beanR = eduService.getYearById(item.getFeeYearId().longValue());
//            if(null!=beanR && null!=beanR.getData()){
//                SchoolFeeYearVos bean = beanR.getData();
//                if(null!=bean){
//                    item.setFeeYear(bean.getFeeYear());
//                }
//            }
//        }
        //学校年级
        if(null!=item.getGradeId()){
            R<SchoolGradeVos> beanR = eduService.getGradeById(item.getGradeId());
            if(null!=beanR && null!=beanR.getData()){
                SchoolGradeVos bean = beanR.getData();
                if(null!=bean){
                    item.setGradeName(bean.getGrade());
                }
            }
        }
    }

    private PayStandardFeeItemVo queryInner(PayStandardFeeItemBo itemBo){
        PayStandardFeeItem query = new PayStandardFeeItem();
        if(null!=itemBo.getFeeYearId()){
            query.setFeeYearId(itemBo.getFeeYearId().intValue());
        }
        query.setCampusId(itemBo.getCampusId());
        query.setCollegeId(itemBo.getCollegeId());
        query.setModelId(itemBo.getModelId());
        query.setMajorId(itemBo.getMajorId());
        query.setStudyPeriod(itemBo.getStudyPeriod());
        query.setGradeId(itemBo.getGradeId());
        List<PayStandardFeeItemVo> feeItems = selectPayStandardFeeItemList(query);
        if(null!=feeItems && !feeItems.isEmpty()){
            return feeItems.get(0);
        }
        return null;
    }

    /**
     * 修改标准收费项目管理
     * 
     * @param payStandardFeeItem 标准收费项目管理
     * @return 结果
     */
    @Override
    public int updatePayStandardFeeItem(PayStandardFeeItem payStandardFeeItem)
    {
        return payStandardFeeItemMapper.updatePayStandardFeeItem(payStandardFeeItem);
    }


    /**
     * 修改标准收费项目管理
     *
     * @param itemBo 标准收费项目管理
     * @return 结果
     */
    @Override
    public AjaxResult updatePayStandardFeeItem(PayStandardFeeItemBo itemBo){
        //转实体
        PayStandardFeeItem item = JSON.parseObject(JSON.toJSONString(itemBo), PayStandardFeeItem.class);
        //转明细
        List<PayStandardFeeItemDetail> detailList = JSON.parseObject(
                JSON.toJSONString(itemBo.getDetails()),
                new TypeReference<List<PayStandardFeeItemDetail>>() {}
        );
        if(null==detailList || detailList.isEmpty()){
            return AjaxResult.error("明细不能为空！");
        }
        //求和
        BigDecimal total = new BigDecimal(0);
        for(PayStandardFeeItemDetail detail:detailList){
            total = total.add(detail.getItemPrice());
        }
        item.setTotalAmount(total);

        LoginUser loginUser = SecurityUtils.getLoginUser();
        item.setCreateTime(new Date());
        item.setUpdateBy(loginUser.getUserid().toString());
        item.setCreateBy(loginUser.getUserid().toString());
        item.setUpdateTime(item.getCreateTime());
        item.setCreateDept(item.getCreateDept());
        item.setTenantId(loginUser.getSysUser().getTenantId().intValue());
        PayStandardFeeItemVo feeItemDb = selectPayStandardFeeItemById(item.getId());
        if(null==feeItemDb){
            return AjaxResult.error("信息不存在");
        }
        if(!feeItemDb.getGenerateStatus().equals(PayConstants.YESORNO_N)){
            return AjaxResult.error("已生成账单，不允许修改");
        }
        //设置字段名（学院专业名、学院模式、校区信息 等等）
        setNames(item);
        //更新
        item.setId(feeItemDb.getId());
        updatePayStandardFeeItem(item);
        //删除明细
        detailService.deletePayStandardFeeItemDetailByFeeItemId(item.getId());

        //查询配置名
        Map<Long, PayFeeItemConfig> confgDic = configService.queryToMap(SecurityUtils.getIntTenantId());
        //填补配置名称
        for(PayStandardFeeItemDetail detail:detailList){
            detail.setFeeItemId(item.getId());
            if(null!=confgDic && confgDic.containsKey(detail.getFeeItemConfigId())){
                PayFeeItemConfig config = confgDic.get(detail.getFeeItemConfigId());
                detail.setFeeItemConfigName(config.getItemName());
                detail.setOrderNum(config.getOrderNum().intValue());
            }
        }
        //保存明细
        detailService.insertBatch(detailList);
        return AjaxResult.success();
    }

    /**
     * 批量删除标准收费项目管理
     * 
     * @param ids 需要删除的标准收费项目管理主键
     * @return 结果
     */
    @Override
    public int deletePayStandardFeeItemByIds(Long[] ids)
    {
        return payStandardFeeItemMapper.deletePayStandardFeeItemByIds(ids);
    }

    /**
     * 删除标准收费项目管理信息
     * 
     * @param id 标准收费项目管理主键
     * @return 结果
     */
    @Override
    public int deletePayStandardFeeItemById(Long id)
    {
        return payStandardFeeItemMapper.deletePayStandardFeeItemById(id);
    }
}
